#!/usr/bin/env python3
import os
import time
import threading

class Logger:
    def __init__(self, client_id : str, log_dir=None):
        self.log_dir = log_dir or ''
        self.lock = threading.Lock()
        self.log_files = {}
        self.client_id = client_id

        # 确保日志目录存在
        if self.log_dir and not os.path.exists(self.log_dir):
            os.makedirs(self.log_dir)

    def set_log_dir(self, log_dir):
        with self.lock:
            self.log_dir = log_dir
            # 关闭所有当前打开的日志文件
            for f in self.log_files.values():
                if not f.closed:
                    f.close()
            self.log_files = {}

            # 确保新的日志目录存在
            if not os.path.exists(self.log_dir):
                os.makedirs(self.log_dir)

    def get_log_file_path(self, connection_name, ip, port):
        # 日志文件格式：客户端id-连接名称-ip地址-端口号
        return os.path.join(self.log_dir, f'{self.client_id}-{connection_name}-{ip}-{port}.log')

    def _process_newlines(self, message):
        """
        处理消息中的换行符，将\r\r\n和\r\n转换为\n
        参数:
            message: 要处理的消息字符串
        
        返回:
            处理后的消息字符串
        """
        if not message:
            return message
        
        # 统一处理所有换行符，将\r\r\n替换为\n
        processed_message = message.replace('\r\r\n', '\n')
        processed_message = processed_message.replace('\r\n', '\n')
        return processed_message

    def log(self, connection_name, message):
        if not self.log_dir:
            return

        with self.lock:
            # 获取连接信息
            for conn_name, (file, ip, port) in self.log_files.items():
                if conn_name == connection_name:
                    # 格式化日志消息
                    timestamp = time.strftime('%Y.%m.%d:%H.%M.%S')
                    
                    # 处理消息中的换行符
                    processed_message = self._process_newlines(message)
                    log_entry = f'{timestamp} {self.client_id}:{processed_message}\n'

                    # 写入日志
                    file.write(log_entry)
                    file.flush()
                    return

            # 如果找不到连接的日志文件，可能是因为连接信息未注册
            # 在实际使用中，应该在创建连接时注册日志文件
            import sys
            print(f'警告：无法记录日志，连接 {connection_name} 的日志文件未注册', file=sys.stderr)
    
    def server_log(self, message):
        if not self.log_dir:
            return
        connection_name = self.client_id
        with self.lock:
            # 获取连接信息
            for conn_name, (file, ip, port) in self.log_files.items():
                if conn_name == connection_name:
                    # 格式化日志消息
                    timestamp = time.strftime('%Y.%m.%d:%H.%M.%S')
                    
                    # 处理消息中的换行符
                    processed_message = self._process_newlines(message)
                    log_entry = f'{timestamp} {self.client_id}:{processed_message}\n'

                    # 写入日志
                    file.write(log_entry)
                    file.flush()
                    return

            # 如果找不到连接的日志文件，可能是因为连接信息未注册
            # 在实际使用中，应该在创建连接时注册日志文件
            import sys
            print(f'警告：无法记录日志，连接 {connection_name} 的日志文件未注册', file=sys.stderr)


    def register_connection(self, connection_name, ip, port):
        with self.lock:
            if connection_name in self.log_files:
                # 关闭旧文件
                old_file, _, _ = self.log_files[connection_name]
                if not old_file.closed:
                    old_file.close()

            # 创建新的日志文件
            log_file_path = self.get_log_file_path(connection_name, ip, port)
            try:
                file = open(log_file_path, 'a', encoding='utf-8')
                self.log_files[connection_name] = (file, ip, port)
                return True
            except Exception as e:
                import sys
                print(f'无法创建日志文件 {log_file_path}: {str(e)}', file=sys.stderr)
                return False

    def unregister_connection(self, connection_name):
        with self.lock:
            if connection_name in self.log_files:
                file, _, _ = self.log_files[connection_name]
                if not file.closed:
                    file.close()
                del self.log_files[connection_name]
                return True
            return False

    def __del__(self):
        # 确保所有日志文件都已关闭
        with self.lock:
            for file, _, _ in self.log_files.values():
                if not file.closed:
                    file.close()
            self.log_files.clear()